package com.itts;

import com.google.common.collect.Maps;
import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;

/**
 * hashMap 容量 测试
 */
public class Demo {
    @Test
    public void test() throws Exception {
        /**
         * 线程安全的Hashmap
         *      1.ConcurrentMap
         *      2.Collections.synchronizedMap(new HashMap<>())
         */

        //计划向HashMap中放入7个元素的时候
        Map<Object, Object> hashmap = Maps.newHashMapWithExpectedSize(10);

        // HashMap初始容量16
        Map<String, String> map = new HashMap<>(7);

        Class<?> mapType = map.getClass();
        Method capacity = mapType.getDeclaredMethod("capacity");
        capacity.setAccessible(true);
        // 这里打印的初始 capacity = 16
        System.out.println("capacity 打印的初始:" + capacity.invoke(map));

        // 向HashMap中put12个元素
        map.put("222", "222");
        map.put("223", "222");
        map.put("224", "222");
        map.put("225", "222");
        map.put("226", "222");


        // 当设定容量为7 时 , 初始化的容量也不会是7 hashMap
        Method capacity2 = mapType.getDeclaredMethod("capacity");
        capacity2.setAccessible(true);
        System.out.println("capacity2 添加第5个值 : " + capacity2.invoke(map));

        // 当向HashMap中put第13个元素时，会触发扩容，容量加倍，变成32
        map.put("234", "222");
        Method capacity3 = mapType.getDeclaredMethod("capacity");
        capacity3.setAccessible(true);
        System.out.println("capacity3 添加第6个值: " + capacity3.invoke(map));

        map.put("235", "222");
        Method capacity4 = mapType.getDeclaredMethod("capacity");
        capacity4.setAccessible(true);
        System.out.println("capacity4 添加第7个值 : " + capacity4.invoke(map));
    }


}
